import 'package:flutter/foundation.dart';
import 'audio_player_tool.dart';
import 'audio_state_listener.dart';
import 'audio_exception.dart';

/// AudioPlayerTool 使用示例
/// 展示如何使用音频播放工具类和状态监听器
class AudioPlayerExample {
  late AudioStateListener _listener;

  /// 初始化示例
  Future<void> initialize() async {
    try {
      // 初始化音频播放器
      await AudioPlayerTool.initialize();

      // 创建状态监听器
      _listener = AudioStateListener();

      // 开始监听音频状态
      _listener.startListening(
        onPositionChanged: _onPositionChanged,
        onDurationChanged: _onDurationChanged,
        onStateChanged: _onStateChanged,
        onPlaybackCompleted: _onPlaybackCompleted,
        onError: _onError,
      );

      if (kDebugMode) {
        debugPrint('AudioPlayerExample 初始化成功');
      }
    } catch (error) {
      if (kDebugMode) {
        debugPrint('AudioPlayerExample 初始化失败: $error');
      }
      rethrow;
    }
  }

  /// 播放音频示例
  Future<void> playExample() async {
    try {
      // 示例音频 URL（这里使用一个测试 URL）
      const audioUrl =
          'https://www.soundjay.com/misc/sounds/bell-ringing-05.wav';

      if (kDebugMode) {
        debugPrint('开始播放示例音频...');
      }

      // 播放音频
      await AudioPlayerTool.play(audioUrl);
    } on AudioPlayException catch (e) {
      if (kDebugMode) {
        debugPrint('播放失败: ${e.message}');
      }
      rethrow;
    } catch (error) {
      if (kDebugMode) {
        debugPrint('播放出错: $error');
      }
      rethrow;
    }
  }

  /// 暂停播放示例
  Future<void> pauseExample() async {
    try {
      await AudioPlayerTool.pause();
      if (kDebugMode) {
        debugPrint('音频已暂停');
      }
    } catch (error) {
      if (kDebugMode) {
        debugPrint('暂停失败: $error');
      }
    }
  }

  /// 继续播放示例
  Future<void> resumeExample() async {
    try {
      await AudioPlayerTool.resume();
      if (kDebugMode) {
        debugPrint('音频继续播放');
      }
    } catch (error) {
      if (kDebugMode) {
        debugPrint('继续播放失败: $error');
      }
    }
  }

  /// 停止播放示例
  Future<void> stopExample() async {
    try {
      await AudioPlayerTool.stop();
      if (kDebugMode) {
        debugPrint('音频已停止');
      }
    } catch (error) {
      if (kDebugMode) {
        debugPrint('停止失败: $error');
      }
    }
  }

  /// 跳转到指定位置示例
  Future<void> seekExample(Duration position) async {
    try {
      await AudioPlayerTool.seekTo(position);
      if (kDebugMode) {
        debugPrint('跳转到: ${AudioPlayerTool.formatDuration(position)}');
      }
    } catch (error) {
      if (kDebugMode) {
        debugPrint('跳转失败: $error');
      }
    }
  }

  /// 设置音量示例
  Future<void> setVolumeExample(double volume) async {
    try {
      await AudioPlayerTool.setVolume(volume);
      if (kDebugMode) {
        debugPrint('音量设置为: ${(volume * 100).toInt()}%');
      }
    } catch (error) {
      if (kDebugMode) {
        debugPrint('设置音量失败: $error');
      }
    }
  }

  /// 预加载音频示例
  Future<void> preloadExample(String url) async {
    try {
      await AudioPlayerTool.preload(url);
      if (kDebugMode) {
        debugPrint('音频预加载成功');
      }
    } on AudioLoadException catch (e) {
      if (kDebugMode) {
        debugPrint('预加载失败: ${e.message}');
      }
    } catch (error) {
      if (kDebugMode) {
        debugPrint('预加载出错: $error');
      }
    }
  }

  /// 获取播放状态示例
  void getStatusExample() {
    if (kDebugMode) {
      debugPrint('当前播放状态: ${AudioPlayerTool.state}');
      debugPrint('是否正在播放: ${AudioPlayerTool.isPlaying}');
      debugPrint('是否已暂停: ${AudioPlayerTool.isPaused}');
      debugPrint('是否已停止: ${AudioPlayerTool.isStopped}');
      debugPrint('播放器是否可用: ${AudioPlayerTool.isAvailable}');
    }
  }

  /// 播放位置变化回调
  void _onPositionChanged(Duration position) {
    if (kDebugMode) {
      debugPrint('播放位置: ${AudioPlayerTool.formatDuration(position)}');
    }
  }

  /// 播放时长变化回调
  void _onDurationChanged(Duration duration) {
    if (kDebugMode) {
      debugPrint('播放时长: ${AudioPlayerTool.formatDuration(duration)}');
    }
  }

  /// 播放状态变化回调
  void _onStateChanged(dynamic state) {
    if (kDebugMode) {
      debugPrint('播放状态变化: $state');
    }
  }

  /// 播放完成回调
  void _onPlaybackCompleted() {
    if (kDebugMode) {
      debugPrint('播放完成');
    }
  }

  /// 错误回调
  void _onError(String error) {
    if (kDebugMode) {
      debugPrint('播放错误: $error');
    }
  }

  /// 释放资源
  Future<void> dispose() async {
    try {
      // 停止监听
      _listener.dispose();

      // 停止播放
      await AudioPlayerTool.stop();

      if (kDebugMode) {
        debugPrint('AudioPlayerExample 资源已释放');
      }
    } catch (error) {
      if (kDebugMode) {
        debugPrint('释放资源失败: $error');
      }
    }
  }
}
